package com.net.xpay.alipay.model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class FundTransUniTransferModel {

    //商户端的唯一订单号，对于同一笔转账请求，商户需保证该订单号唯一。
    private String outBizNo;

    //订单总金额，单位为元，精确到小数点后两位，取值范围
    private String transAmount;

    //产品码，固定值
    private String productCode;

    //资金归集
    private String bizScene;

    //付款方信息
    private PayerInfo payerInfo;

    //转账业务的标题，用于在支付宝用户的账单里显示。
    private String orderTitle;

    //业务备注
    private String remark;

    //转账业务请求的扩展参数
    private String businessParams;

    //收款方信息
    private PayeeInfo payeeInfo;


    @Getter
    @Setter
    @NoArgsConstructor
    public static class PayerInfo {
        //账本id
        private String identity;

        //ACCOUNT_BOOK_ID
        private String identityType;

        //传入记账本id与场景码，不传会校验失败导致失败。注意：ext_info字段本质上是String类型，所以传递的是转义后的json字符串。
        //{\"agreement_no\":\"20205131000905016778\",\"account_book_id\":\"2088000115291397\",\"accountbook_scene_code\":\"SATF_FUND_BOOK\"}"
        private String extInfo;
    }

    @Setter
    @NoArgsConstructor
    public static class PayeeInfo {
        //收款方账号，传入支付宝账号或者支付宝uid test@taobao.com 必选
        private String identity;

        //1.当identity传入支付宝账号时，identity_type传ALIPAY_LOGON_ID 2.当当identity传入支付宝uid时，identity_type传ALIPAY_USER_ID  3.BANKCARD_ACCOUNT 银行卡 必选
        private String identityType;

        private String extInfo;

        //参与方真实姓名，如果非空，将校验收款支付宝账号姓名一致性。当identity_type传ALIPAY_LOGON_ID时此字段必选
        private String name;

        //收款方银行卡信息
        private BankcardExtInfo bankcardExtInfo;

        public static TransOrderModel.PayeeInfo getInstance() {
            return new TransOrderModel.PayeeInfo();
        }
    }

    @Setter
    @Getter
    @NoArgsConstructor
    public static class BankcardExtInfo {
        //当收款账户为对公账户时，机构名称必填；当收款账户为对私账户时，机构名称可为空。机构名称参见 银行机构名称。例如：交通银行
        private String instName;

        //收款账户类型。
        //1：对公（在金融机构开设的公司账户）,如果银行卡为对公，必须传递省市支行信息或者联行号。
        //2：对私（在金融机构开设的个人账户）
        private String accountType;

        //银行所在省份
        private String instProvince;

        //收款银行所在市
        private String instCity;

        //收款银行所属支行
        private String instBranchName;

        //银行支行联行号
        private String bankCode;
    }
}
